package com.atguigu.utils;
/*
dimApp：1.程序运行的时候open方法从mysql先查询配置信息，就避免主流先进入procesElement方法但是配置流还没过来了
        2.以后要从phoenix读dim数据
        任何jdbc框架的任何查询语句

 * 任何JDBC框架的任何查询语句
 * select count(*) from t;                      单行单列
 * select * from t where id = '1001'; id是主键   单行多列
 * select id from t;                            多行单列
 * select * from t;                             多行多列

 * 1001,zs,male
 * 1002,ls,female
 */

import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JdbcUtil {
    //boolean underScoreToCamel：要不要把sql查询语句的字段转化为javabean的驼峰命名
    public static <T> List<T> queryList(Connection connection, String sql, Class<T> clz, boolean underScoreToCamel) throws SQLException, IllegalAccessException, InstantiationException, InvocationTargetException {//T是一行数据，可以返回javabean或json字符串，看你想要返回的一行数据是什么类型
        //创建集合用于存放查询结果数据
        ArrayList<T> list = new ArrayList<>();

        //编译sql
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //执行查询
        ResultSet resultSet = preparedStatement.executeQuery();

        //获取列的个数
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        //遍历查询结果，将每行数据转化为T对象放入集合
        //行遍历
        while (resultSet.next()) {
            //创建T对象，要将每行数据转化为T对象
            T t = clz.newInstance();
            //列遍历
            for (int i = 0; i < columnCount; i++) {
                String columnName = metaData.getColumnName(i + 1);//获取列名，下标是从1开始
                Object value = resultSet.getObject(i + 1);//获取i+1下标列名对应的列值

                //处理列名问题（例如将dim：open方法要从mysql配置表里读数据转化为javabean，要把tm_name转化为tmName）
                if (underScoreToCamel) {
                    //LOWER_UNDERSCORE小写的下划线的columnName.toLowerCase()小写的名字例如tm_name转化为小驼峰
                    columnName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName.toLowerCase());

                }
                BeanUtils.setProperty(t, columnName, value);

            }
            //查询的每一行数据结果转化为T对象
            list.add(t);
        }

        resultSet.close();
        preparedStatement.close();
        //连接不能在这里释放，连接在哪释放，在这里就释放的话，下一次查询就没有连接了

        //返回集合
        return list;


    }
    //执行查询测试
    public static void main(String[] args) throws Exception {

        DruidPooledConnection phoenixConn = DruidDSUtil.getPhoenixConn();
        //sql不能加分号，否则就报错
        List<JSONObject> jsonObjects = queryList(phoenixConn, "select * from GMALL220828_REALTIME.DIM_BASE_TRADEMARK", JSONObject.class, false);
        for (JSONObject jsonObject : jsonObjects) {
            System.out.println(jsonObject);
        }

        phoenixConn.close();



    }
}
